package org.geogebra.common.kernel;

import org.geogebra.common.kernel.kernelND.GeoElementND;
import org.geogebra.common.kernel.kernelND.GeoPointND;

/**
 * PathOrPoint needed as well as Path so that points can be elements of compound
 * paths eg {(2,3), (4,5), Segment[(6,7),(8,9)] } see GeoList.pointChanged()
 */

public interface PathOrPoint extends GeoElementND {

	/*
	 * static final int PATH_LINE = 0; static final int PATH_SEGMENT = 1; static
	 * final int PATH_ELLIPSE = 10; static final int PATH_HYPERBOLA = 11; static
	 * final int PATH_PARABOLA = 12; static final int PATH_POINT = 13; static
	 * final int PATH_EMPTY = 14; static final int PATH_FUNCTION = 20;
	 */

	/**
	 * Sets coords of P and its path parameter when the coords of P have
	 * changed. Afterwards P lies on this path.
	 * 
	 * Note: P.setCoords() is not called!
	 * 
	 * @param PI
	 *            point P
	 */
	public void pointChanged(GeoPointND PI);

	/**
	 * Sets coords of P and its path parameter when this path has changed.
	 * Afterwards P lies on this path.
	 * 
	 * Note: P.setCoords() is not called!
	 * 
	 * @param PI
	 *            point P
	 */
	public void pathChanged(GeoPointND PI);

	/**
	 * Returns true iff the given point lies on this path.
	 * 
	 * @param PI
	 *            point
	 * @param eps
	 *            precision
	 * @return true iff the given point lies on this path.
	 */
	public boolean isOnPath(GeoPointND PI, double eps);

	/**
	 * Returns the smallest possible parameter value for this path (may be
	 * Double.NEGATIVE_INFINITY)
	 * 
	 * @return minimum parameter value for this path
	 */
	public double getMinParameter();

	/**
	 * Returns the largest possible parameter value for this path (may be
	 * Double.POSITIVE_INFINITY)
	 * 
	 * @return maximum parameter value for this path
	 */
	public double getMaxParameter();

	/**
	 * Returns whether this path is closed (i.e. its first and last point are
	 * equal).
	 * 
	 * @return true iff closed
	 */
	public boolean isClosedPath();

	/**
	 * Returns a PathMover object for this path.
	 * 
	 * @return a PathMover object for this path.
	 */
	public PathMover createPathMover();

}
